AWS CodePipelineをCloudFormationで構築してみた
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。 AWSのDevOps系のサービスであるCodePipeline触ってみました。 普通にManagement Consoleから構築するのは以下を参考にするとよいかと思います。
CodePipeline で CodeCommit/CodeBuild/CodeDeploy を繋げてデリバリプロセスを自動化してみた #reinvent
上記の記事を追従するのも良いですが、今後のことも見通してCloudFormationで今回は構築しました。
テンプレート
Parameters: GitHubOwner: Type: String Description: GitHub Owner Name GitHubToken: Type: String Description: GitHub Token Repository: Type: String Description: GitHub Repository Branch: Type: String Description: GitHub Branch ServiceName: Description: Name for the service Type: String AllowedPattern: "[-_ a-zA-Z0-9]*" ConstraintDescription: can contain only alphanumeric characters, spaces, dashes and underscores. CodePipelineArtifactStoreBucket: Type: String CodePipelineRoleArn: Type: String CodeBuildRoleArn: Type: String CodeBuildImage: Type: String Default: "aws/codebuild/nodejs:7.0.0" Description: Image used for CodeBuild project. Resources: CodeBuildProject: Description: Creating AWS CodeBuild project Type: AWS::CodeBuild::Project Properties: Artifacts: Type: CODEPIPELINE Description: !Sub Building stage for ${Branch}. Environment: ComputeType: BUILD_GENERAL1_SMALL EnvironmentVariables: - Name: Branch Value: !Ref Branch Image: !Ref CodeBuildImage Type: LINUX_CONTAINER Name: !Sub ${ServiceName}-${Branch}-build ServiceRole: !Ref CodeBuildRoleArn Source: Type: CODEPIPELINE TimeoutInMinutes: 5 ProjectPipeline: Type: AWS::CodePipeline::Pipeline Properties: ArtifactStore: Location: !Ref CodePipelineArtifactStoreBucket Type: S3 Name: !Sub ${ServiceName}-${Branch}-Pipeline RestartExecutionOnUpdate: false RoleArn: Ref: CodePipelineRoleArn Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: ThirdParty Provider: GitHub Version: 1 OutputArtifacts: - Name: SourceOutput Configuration: Owner: !Ref GitHubOwner Repo: !Ref Repository Branch: !Ref Branch OAuthToken: !Ref GitHubToken RunOrder: 1 - Name: Build Actions: - Name: CodeBuild InputArtifacts: - Name: SourceOutput ActionTypeId: Category: Build Owner: AWS Version: 1 Provider: CodeBuild Configuration: ProjectName: !Ref CodeBuildProject OutputArtifacts: - Name: CodebuildOutput RunOrder: 1
パラメータ
- GitHubOwner デプロイ対象のGithubリポジトリの所有者を入力します。
- GitHubToken デプロイ対象のリポジトリにアクセスするためのTokenを入力します。 GithubのユーザーのメニューからSetting→Developer settings → Personal access Tokenで取得できます。
- Repository デプロイ対象のGithubリポジトリ名を入力します。
- Branch デプロイ対象のブランチ名を入力します。
- ServiceName デプロイ対象のサービス名を指定します。
- CodePipelineArtifactStoreBucket CodePipelineの結果を格納するS3 Bucketを指定します。
- CodePipelineRoleArn CodePipelineに付与するRoleのARNを指定します。
- CodeBuildRoleArn CodeBuildに付与するRoleのARNを指定します。
- CodeBuildImage CodeBuildのビルド環境のコンテナイメージ名を指定します。
動かしてみた
以下のGithubのリポジトリを対象に、上記のCloudFormationを動かしてみました。
CM-Kajiwara/codepipeline_sample
Cloudformationのスタックが作成された後、CodePipelineが自動で動き出します。 CodePipelineから呼び出されたCodeBuildがリポジトリに配置してあるbuildspec.ymlに基いてビルドをおこないます。
まとめ
そんなに大きくハマること無く、CodePipelineの構築ができました。
このテンプレート自体は構築に用いるブランチ名等はすべてパラメータになっています。 そのため後はBuildのステージを増やす等することで、案件固有のテンプレートに育てることができるのではと思っております。